package demo.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 获取构造方法
 * 1. 批量获取的方法
 *     - public Constructor[] getContructors():所有“公有的”构造方法
 *     - public Constructor[] getDeclaredContructors():获取所有的构造方法
 * 2. 获取单个的方法，并调用
 *     - public Constructor getConstructor(Class.. parameterTypes):获取单个的“公有的”构造方法
 *     - public Constructor getDeclaredConstructor(Class.. parameterTypes):获取某个构造方法，所有的都有可以获取。
 *
 * 调用方式:
 * Constructor->newInstance(Object..initargs)
 *
 * @ClassName ConstructorCollector
 * @Description
 * @Author 47980
 * @Date 2020/6/10 21:01
 * @Version V_1.0
 **/
public class ConstructorCollector {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class clazz = Class.forName("demo.reflect.ReflectTarget");
        //1.获取所有的公有构造方法
        System.out.println("================= 获取所有的公有构造方法 =================");
        Constructor[] constructors = clazz.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }

        //2.获取所有的构造方法
        System.out.println("================= 获取所有的构造方法 =================");
        Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
        for (Constructor declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }

        //3.获取单个带参数的构造方法
        System.out.println("================= 获取单个带参数的构造方法 =================");
        Constructor constructor = clazz.getConstructor(String.class, int.class);
        System.out.println("constructor = " + constructor);

        //4.获取单个私有的构造方法
        System.out.println("================= 获取单个私有的构造方法 =================");
        Constructor declaredConstructor = clazz.getDeclaredConstructor(int.class);
        System.out.println("private = " + declaredConstructor);

        //5.调用私有构造方法
        System.out.println("================= 调用私有构造方法 =================");
        //暴力访问（忽略访问修饰符）
        declaredConstructor.setAccessible(true);
        ReflectTarget reflectTarget = (ReflectTarget) declaredConstructor.newInstance(1);
    }
}
